package com.ydlclass.config;
import com.ydlclass.IdGenerator;
import com.ydlclass.discovery.RegistryConfig;
import com.ydlclass.loadbalancer.LoadBalancer;
import com.ydlclass.loadbalancer.impl.RoundRobinLoadBalancer;
import com.ydlclass.protection.CircuitBreaker;
import com.ydlclass.protection.RateLimiter;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.net.SocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 全局的配置类，代码配置--->xml配置--->默认项
 */
@Data
@Slf4j
public class Configuration{

    //配置信息-->端口号
    private int port = 8093;

    //配置信息-->应用程序的名字
    private String appName = "default";

    //分组信息
    private String group = "default";

    //配置信息-->注册中心
    private RegistryConfig registryConfig = new RegistryConfig("zookeeper://127.0.0.1:2181");

    //配置信息-->序列化使用的协议
    private String serializeType = "jdk";

    //配置信息-->压缩使用的协议
    private String compressType = "gzip";

    //配置信息-->ID生成器
    private IdGenerator idGenerator = new IdGenerator(1,2);

    //配置信息-->负载均衡策略
    private LoadBalancer loadBalancer = new RoundRobinLoadBalancer();

    //为每一个ip设置一个限流器
    private final Map<SocketAddress, RateLimiter> everyIpRateLimiter = new ConcurrentHashMap<>(16);

    //为每一个ip设置一个断路器
    private final Map<SocketAddress, CircuitBreaker> everyIpCircuitBreaker = new ConcurrentHashMap<>(16);

    // 读xml，dom4j
    public Configuration(){
        // 1.成员变量的默认配置项

        // 2.spi机制发现相关配置项
        SpiResolver spiResolver = new SpiResolver();
        spiResolver.loadFromSpi(this);

        // 3.读xml获得上面的信息
        XmlResolver xmlResolver = new XmlResolver();
        xmlResolver.loadFromXml(this);

        // 4.编程配置项 由yrpcBootstrap提供
    }

    // 代码配置由引导程序完成
}
